﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _443_Server
{
	public class PacketParser
	{
		public static int[] PACKET_LENGTHS = new int[] {
			// 0 1 2 3 4 5 6 7 8 9
			8, -3, -3, -3, -1, -3, -3, -3, -3, -3, // 0
			-3, 2, -3, -3, -3, -3, -3, -3, -3, -3, // 1
			-3, 0, -3, -3, -3, -3, -3, -3, -3, 8, // 2
			-3, -3, -3, -3, -3, -3, 2, -3, -3, -3, // 3
			-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, // 4
			-3, -3, -3, -3, 4, -3, -3, -3, -3, -3, // 5
			-3, -3, -3, -3, -3, -3, 4, -3, -3, -3, // 6
			0, -3, -3, -3, -3, -3, 3, -3, -3, -3, // 7
			-1, -1, -3, -3, -3, 6, 0, -3, -3, -3, // 8
			-3, -3, -3, -3, -3, -3, -3, -3, -3, -1, // 9
			-3, 2, -3, -3, -3, -3, -3, -3, -3, -3, // 10
			-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, // 11
			6, -3, -3, -3, -3, -3, -3, -3, -3, -3, // 12
			-3, -3, -3, -1, -3, -3, -3, -3, -3, -3, // 13
			-3, 4, -3, -3, 8, -3, -3, -3, -3, -3, // 14
			-3, -3, -3, 6, -3, -3, -3, -3, -3, -3, // 15
			-3, -3, 4, -3, -3, -3, -3, -3, -3, 2, // 16
			-3, -3, -3, -3, -1, -3, -3, -3, 8, -3, // 17
			-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, // 18
			-3, -3, 0, -3, -1, 14, -3, -3, -3, -3, // 19
			-3, -3, -3, -3, -3, -3, -3, 1, -3, -3, // 20
			-3, -3, -3, -3, -3, -3, -3, -3, -3, 2, // 21
			-3, -3, -3, -3, 2, -3, -3, -3, -3, -3, // 22
			-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, // 23
			-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, // 24
			-3, -3, -3, -3, -3, // 25
	};

		public static void ParsePacket(Player p, int packet, int size)
		{
			int start = p.InStream.BufferLocation;
			ushort interfaceID, id;
			switch (packet)
			{
				case 21: //map region
				case 66: //move camera
				case 141: //map region
				case 162: //click
				case 194: //pong
				case 207: //focus change
					break;

				case 70: //bring up report menu
					break;

				case 76: //toggle chat options
					byte publicChat = p.InStream.ReadByte();
					byte privateChat = p.InStream.ReadByte();
					byte tradeChat = p.InStream.ReadByte();
					Console.WriteLine("Switched chat: " + publicChat + ", " + privateChat + ", " + tradeChat);
					break;

				case 86: //ping
					p.OutPackets.SendPingPacket();
					break;

				case 54: //button click
					interfaceID = p.InStream.ReadWord();
					id = p.InStream.ReadWord();

					p.OutPackets.CloseAllInterfaces();

					Console.WriteLine("Button clicked: interface " + interfaceID + ", button " + id);
					break;

				default:
					Console.WriteLine("Unhandled packet " + packet + " with size " + size + ": " + ListBytes(p, size));
					break;
			}
		}

		public static string ListBytes(Player p, int size)
		{
			string s = "";
			for (int i = 0; i < size; i++)
			{
				byte b = p.InStream.ReadByte();
				string str = b.ToString("X");
				if (str.Length == 1)
					str = "0" + str;
				s += str + " ";
			}
			s = s.Trim();
			return s;
		}
	}
}
